Hibernate-এ Custom Exception Handling এবং Global Exception Handling ব্যবহার করার মাধ্যমে আপনার অ্যাপ্লিকেশনকে আরও স্থিতিশীল এবং ব্যবহারকারী বান্ধব করা যায়। যখন ডেটাবেস অপারেশনের সময় কোনো সমস্যা বা ত্রুটি ঘটে, তখন আপনি কাস্টম এক্সসেপশন তৈরি করে তা আরও পরিষ্কারভাবে ম্যানেজ করতে পারেন। এর পাশাপাশি, Global Exception Handling ব্যবহার করে একযোগভাবে সমস্ত এক্সসেপশনগুলো হ্যান্ডেল করা যেতে পারে।
1. Custom Exception Handling in Hibernate
Custom Exceptions Hibernate বা Spring Boot অ্যাপ্লিকেশনে ব্যবহারকারীর জন্য নির্দিষ্ট ত্রুটিগুলিকে হ্যান্ডল করার জন্য তৈরি করা হয়। উদাহরণস্বরূপ, আপনি যখন ডেটাবেসে কোনো অবজেক্ট সেভ, আপডেট বা ডিলিট করতে চান, কিন্তু যদি কোনো সমস্যা হয় (যেমন, constraint violation বা data integrity violation), তবে আপনি কাস্টম এক্সসেপশন ব্যবহার করে ব্যবহারকারীকে সঠিকভাবে ত্রুটির বার্তা প্রদর্শন করতে পারেন।
Steps to Create a Custom Exception:
- Create a Custom Exception Class: একটি কাস্টম এক্সসেপশন ক্লাস তৈরি করুন যা
RuntimeExceptionবাExceptionএর কাছ থেকে উত্তরাধিকার লাভ করবে।
public class EmployeeNotFoundException extends RuntimeException {
public EmployeeNotFoundException(String message) {
super(message);
}
public EmployeeNotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
- Explanation:
EmployeeNotFoundExceptionএকটি কাস্টম এক্সসেপশন যাRuntimeExceptionথেকে উত্তরাধিকার লাভ করে।- এটি একটি কনস্ট্রাক্টর প্রদান করে, যা ত্রুটির বার্তা বা ত্রুটির কারণ (cause) গ্রহণ করে।
- Throw Custom Exception in Service Layer: যখন কোনো নির্দিষ্ট ডেটাবেস অপারেশন সফল না হয়, তখন আপনি এই কাস্টম এক্সসেপশনটি থ্রো করতে পারেন।
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee getEmployeeById(int id) {
// Try to fetch employee by id
Optional<Employee> employee = employeeRepository.findById(id);
// If employee not found, throw custom exception
if (!employee.isPresent()) {
throw new EmployeeNotFoundException("Employee with id " + id + " not found");
}
return employee.get();
}
}
- Explanation:
- এখানে, যদি
Employeeটেবিল থেকে নির্দিষ্ট আইডি দিয়ে কোনো কর্মচারী না পাওয়া যায়, তাহলেEmployeeNotFoundExceptionকাস্টম এক্সসেপশন থ্রো করা হবে।
- এখানে, যদি
2. Global Exception Handling with Spring Boot
Spring Boot-এ Global Exception Handling করতে হলে আপনি @ControllerAdvice অ্যানোটেশন ব্যবহার করতে পারেন। এটি একটি centralized exception handler তৈরি করতে সহায়তা করে, যার মাধ্যমে আপনি অ্যাপ্লিকেশনের সব এক্সসেপশনকে এক জায়গায় হ্যান্ডেল করতে পারবেন।
Steps to Implement Global Exception Handling:
- Create a Global Exception Handler Class:
@ControllerAdviceঅ্যানোটেশন ব্যবহার করে একটি ক্লাস তৈরি করুন যা সমস্ত এক্সসেপশন হ্যান্ডলিং করবে।
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalExceptionHandler {
// Handle custom exception
@ExceptionHandler(EmployeeNotFoundException.class)
public ResponseEntity<String> handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
// Return a response with the error message and HTTP status 404 (Not Found)
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
// Handle general exceptions
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleGeneralException(Exception ex) {
// Return a response with the error message and HTTP status 500 (Internal Server Error)
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
- Explanation:
@ControllerAdvice: এটি Spring-এর একটি অ্যানোটেশন যা গ্লোবাল এক্সসেপশন হ্যান্ডলার তৈরি করতে ব্যবহৃত হয়।@ExceptionHandler: এই অ্যানোটেশনটি কোনো নির্দিষ্ট এক্সসেপশন ক্লাস হ্যান্ডল করার জন্য ব্যবহৃত হয়। এখানেEmployeeNotFoundExceptionএবং সাধারণExceptionহ্যান্ডল করা হয়েছে।
- Test the Exception Handling in Controller: এখন, যখন
EmployeeNotFoundExceptionথ্রো হবে, তখন এটি GlobalExceptionHandler-এ গ্লোবালি হ্যান্ডল হবে এবং একটি404 Not Foundরেসপন্স ফিরে আসবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/employees/{id}")
public Employee getEmployee(@PathVariable int id) {
return employeeService.getEmployeeById(id);
}
}
- Explanation:
EmployeeController-এgetEmployeeById()মেথডটি যদি কোনো কর্মচারী না পায়, তবেEmployeeNotFoundExceptionথ্রো করবে এবং এটি GlobalExceptionHandler দ্বারা হ্যান্ডল হবে।
3. Handling Other Common Exceptions
Spring Boot-এ Global Exception Handling এর মাধ্যমে আপনি সাধারণ এবং কাস্টম এক্সসেপশনগুলিকে একটি একক জায়গায় হ্যান্ডল করতে পারেন। আপনি যেমন ConstraintViolationException, DataIntegrityViolationException, ইত্যাদি Hibernate সম্পর্কিত এক্সসেপশনও হ্যান্ডল করতে পারেন।
Example: Handling Data Integrity Violations
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<String> handleDataIntegrityViolation(DataIntegrityViolationException ex) {
// Return a response with the error message and HTTP status 400 (Bad Request)
return new ResponseEntity<>("Data integrity violation: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
- Explanation:
DataIntegrityViolationException: এই এক্সসেপশনটি Hibernate বা JPA থেকে আসে যখন ডেটাবেসে কোনো কনস্ট্রেইন্ট ভায়োলেট করা হয়, যেমন একটি ইউনিক কনস্ট্রেইন্ট ভাঙা।
4. Returning Custom Error Responses
যখন কোনো এক্সসেপশন ঘটে, আপনি কাস্টম Error Response অবজেক্ট তৈরি করে আরও বিস্তারিত তথ্য প্রদান করতে পারেন। উদাহরণস্বরূপ, আপনি HTTP স্ট্যাটাস কোড, ত্রুটির বার্তা এবং ট্রেস প্রিন্ট করতে পারেন।
Custom Error Response Class:
public class ErrorResponse {
private int status;
private String message;
private long timestamp;
public ErrorResponse(int status, String message, long timestamp) {
this.status = status;
this.message = message;
this.timestamp = timestamp;
}
// Getters and Setters
}
Modify Global Exception Handler to Use Custom Error Response:
@ExceptionHandler(EmployeeNotFoundException.class)
public ResponseEntity<ErrorResponse> handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(),
ex.getMessage(),
System.currentTimeMillis());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
- Explanation:
- ErrorResponse ক্লাসে আমরা ত্রুটির স্ট্যাটাস, বার্তা এবং টাইমস্ট্যাম্প সংরক্ষণ করেছি এবং
handleEmployeeNotFoundExceptionমেথডে ErrorResponse রিটার্ন করেছি।
- ErrorResponse ক্লাসে আমরা ত্রুটির স্ট্যাটাস, বার্তা এবং টাইমস্ট্যাম্প সংরক্ষণ করেছি এবং
Hibernate এবং Spring Boot ব্যবহার করে Custom Exception এবং Global Exception Handling অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটাবেস অপারেশনের সময়ে ঘটে যাওয়া ত্রুটিগুলি সঠিকভাবে হ্যান্ডল করতে সহায়তা করে।
- Custom Exceptions আপনাকে কাস্টম বার্তা প্রদান করতে এবং নির্দিষ্ট ত্রুটিগুলি হ্যান্ডল করতে সক্ষম করে।
- Global Exception Handling ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের সমস্ত এক্সসেপশনকে এক জায়গায় হ্যান্ডল করতে পারবেন এবং ইউজারকে পরিষ্কার ত্রুটি বার্তা প্রদান করতে পারবেন।
এটি আপনার অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে।
Read more